UI
根据论坛的说法,是没有办法动态增减变量的,因此如果想要实现类似效果,需要提前申请几万个变量进行备用,然后动态地显示或者隐藏。
禁止变量的方法很简单,在更新变量的阶段书写如下代码
AEGP_SuiteHandler suites(in_data->pica_basicP);
auto parm_copy = *params[YOUR_PARM_INDEX];
parm_copy.ui_flags |= PF_PUI_DISABLE;
suites.ParamUtilsSuite3()->PF_UpdateParamUI(in_data->effect_ref, YOUR_PARM_INDEX, &new_parm);
对于AE和PR来说,隐藏变量的方法是不一样的。
和禁止变量的方法一样,先拷贝变量,然后将其ui_flags属性按位与上PF_PUI_INVISIBLE。
nmd在文档里面没有任何地方标注不能使用如上的方法进行修改,你需要去翻阅Supervisor.sln的源代码阅读如何隐藏变量。 总之,你可以使用如下代码隐藏变量
AEGP_StreamRefH stream_refH = 0;
AEGP_EffectRefH fxH = 0;
suites.PFInterfaceSuite1()->AEGP_GetNewEffectForEffect(0, in_data->effect_ref, &fxH);
// nmd,必须使用StreamSuite2和DynamicStreamSuite2才能起效,文档里面根本没提
suites.StreamSuite2()->AEGP_GetNewEffectStreamByIndex(0, fxH, YOUR_PARM_INDEX, &stream_refH);
suites.DynamicStreamSuite2()->AEGP_SetDynamicStreamFlag(stream_refH, AEGP_DynStreamFlag_HIDDEN, FALSE, hide);
suites.EffectSuite2()->AEGP_DisposeEffect(fxH);
suites.StreamSuite2()->AEGP_DisposeStream(stream_refH);
使用AEGP_SetStreamName()。
AEGP_StreamRefH stream_refH = 0;
AEGP_EffectRefH fxH = 0;
suites.PFInterfaceSuite1()->AEGP_GetNewEffectForEffect(0, in_data->effect_ref, &fxH);
// ??????? you must use StreamSuite2 and DynamicStreamSuite2 ???????
suites.StreamSuite2()->AEGP_GetNewEffectStreamByIndex(0, fxH, PARAMARAMA_FLOAT_VAL, &stream_refH);
suites.DynamicStreamSuite2()->AEGP_SetStreamName(stream_refH, "New Parameter Name");
//suites.DynamicStreamSuite2()->AEGP_SetDynamicStreamFlag(stream_refH, AEGP_DynStreamFlag_HIDDEN, FALSE, hide);
suites.EffectSuite2()->AEGP_DisposeEffect(fxH);
suites.StreamSuite2()->AEGP_DisposeStream(stream_refH);
需要在PF_Cmd_PARAMS_SETUP阶段将变量的ui_flags按位与上PF_PUI_NO_ECW_UI。例如可以用如下代码添加一个在效果控制面板隐藏但在时间线面板显示的Group:
PF_ParamDef def{};
def.ui_flags |= PF_PUI_NO_ECW_UI;
PF_ADD_TOPIC("topic", TOPIC_START_DISK_ID);
但是无法在PF_Cmd_USER_CHANGED_PARAM阶段动态调整。